/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package adbus.models;

import adbus.libraries.Database;
import adbus.libraries.ORM;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author rafal
 */
  /**główna klasa Pojazd*/
public class Pojazd extends ORM {
    private LinkedList<Pojazd> vehicles = null;
    private static FormatList formats = null;
    public LinkedList<Pojazd> pobierz() {
        try {
            result = Database.querySelect(basicQuery() + getWhere(), filtersval);
            if(vehicles == null)
                vehicles = new LinkedList<Pojazd>();
            while(result.next()) {
                Pojazd p = new Pojazd();
                p.zaladuj(result);
                vehicles.add(p);
            }
        } catch (SQLException ex) {
            Logger.getLogger(Pojazd.class.getName()).log(Level.SEVERE, null, ex);
        }
        return vehicles;
    }
      /**metoda tworząca nową liste formatów reklam*/
    public FormatList pobierzFormaty() {
        if(formats == null) {
            formats = new FormatList();
        }
        formats.clear();
        Format tmp = new Format();
        tmp.setVehicleFilter(id_pojazdu);
        LinkedList<Format> l = tmp.pobierz();
        for(Format el: l) {
            formats.addElement(el);
        }
        formats.reload();
        return formats;
    }
    @Override
      /**metoda zwracająca wszystkie dane z tabeli Pojazdy połączoną z tabelami Modele_pojazdów i Typy_pojazdu*/
    public String basicQuery() {
        return "SELECT * FROM Pojazdy p " +
                "JOIN Modele_pojazdów m " +
                "ON p.id_modelu = m.id_modelu " +
                "JOIN Typy_pojazdu t " +
                "ON t.id_typ = m.id_typ";
    }
    public void zaladuj() {
        super.zaladuj();
        try {
            zaladuj(result);
        } catch (SQLException ex) {
            Logger.getLogger(Pojazd.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public void zaladuj(ResultSet result) throws SQLException {
        if(result.isBeforeFirst()) result.first();
        id_pojazdu = result.getInt("id_pojazd");
        nr_pojazdu = result.getInt("nr_pojazdu");
        id_linia = result.getInt("id_linia");
        id_modelu = result.getInt("id_modelu");
        model_name = result.getString("m.nazwa");
    }
    public Integer id_pojazdu = null;
    public Integer nr_pojazdu = null;
    public Integer id_linia = null;
    public Integer id_modelu = null;
    public String model_name = null;

    void setAvailableFilter(String from, String to) {
        String condition = "p.id_pojazd IN ( "
                + "SELECT p.id_pojazd  "
                + "FROM Pojazdy p  "
                + "JOIN Linie l ON p.id_linia = l.id_linia  "
                + "LEFT JOIN Reklamy r ON p.id_pojazd = r.id_pojazdu  "
                + "LEFT JOIN Kampanie k ON k.id_kampania = r.id_kampania   "
                + "WHERE (NOT( "
                + "(data_rozpoczecia <= ? AND data_zakonczenia > ?) "
                + "OR  (data_rozpoczecia > ? AND data_rozpoczecia <= ?)) "
                + "OR data_rozpoczecia IS NULL) "
                + ")";
        filters.put("available", condition);
        filtersval.put("a1", from);
        filtersval.put("a2", from);
        filtersval.put("a3", from);
        filtersval.put("a4", to);
    }
      /**metoda odpowiedzialna za filtrowanie pojazdów wg id lini*/
    void setLineFilter(int id_linia) {
        filters.put("line", "p.id_linia = ?");
        filtersval.put("line", id_linia);
    }
    @Override
    public String toString() {
        return nr_pojazdu.toString() + ", " + model_name;
    }
      /**metoda zapisująca nowy pojazd do tabeli Pojazdy*/
    public void zapisz() {
        String q = "INSERT INTO Pojazdy(nr_pojazdu,id_linia,id_modelu) VALUES(?,?,?)";
        LinkedHashMap<String,Object> map = new LinkedHashMap<String, Object>();
        map.put("1", nr_pojazdu);
        map.put("2", id_linia);
        map.put("3", id_modelu);
        ResultSet temp = super.zapisz(q, "id_pojazd", map);
        try {
            id_pojazdu = temp.getInt(1);
        } catch (SQLException ex) {
            Logger.getLogger(Pojazd.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
      /**metoda usuwająca pojazd o podanym id z tabeli Pojazdy*/
    public void delete() {
        try {
            Database.queryUpdate("DELETE FROM Pojazdy WHERE id_pojazd = " + id_pojazdu, "id_pojazd");
        } catch (SQLException ex) {
            Logger.getLogger(Klient.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    void pobierzWgId(int aInt) {
        setIDFilter(aInt);
        zaladuj();
    }

    private void setIDFilter(int aInt) {
        filters.put("id","id_pojazd = ?");
        filtersval.put("id", aInt);
    }
}
